import os
import traceback
import logging
from PyPDF2 import PdfReader
from config import Config
from ..module.extraction import approval_version,document_dvp_version, extract_page_number, identify_signature_type, contains_keywords
from ..utils.ocr import is_ocr_page
from ..utils.logger import pdf_logger



def process_source1_dvp(pdf_path):
    """
    处理源目录1中的"数据核查计划"类PDF
    :param pdf_path: PDF文件路径
    :return: 处理结果列表
    """
    results = []
    file_name = os.path.basename(pdf_path)

    try:
        # 检查文件名是否包含数据核查计划关键词
        file_keyword = contains_keywords(file_name, Config.SPECIAL_KEYWORDS_DVP)
        if not file_keyword:
            pdf_logger.info(f"⚠️ 文件名未匹配到任何数据核查计划关键词[{Config.SPECIAL_KEYWORDS_DVP}]，跳过")
            return results
        pdf_logger.info(f"✅ 匹配数据核查计划关键词：{file_keyword}")

        reader = PdfReader(pdf_path)
        total_pages = len(reader.pages)
        max_pages = min(Config.MAX_PROCESS_PAGES, total_pages)
        pdf_logger.info(f"📊 总页数：{total_pages} | 计划处理页数：{max_pages}")

        for page_idx in range(max_pages):
            page_num = page_idx + 1
            page = reader.pages[page_idx]
            
            # 检查页面是否以图像层为主
            if is_ocr_page(page):
                pdf_logger.info(f"ℹ️ 第{page_num}页：页面以图像层为主，已经是签字页了")
                continue
            
            text = page.extract_text() or ""

            sig_type = identify_signature_type(text)
            if not sig_type:
                pdf_logger.info(f"⚠️ 第{page_num}页：未识别到签字类型，跳过")
                continue

            version = document_dvp_version(text)
            if not version:
                pdf_logger.info(f"⚠️ 第{page_num}页：已识别签字类型[{sig_type}]，但未提取到版本号，跳过")
                continue

            results.append({
                "file_name": file_name,
                "page_num": page_idx,
                "page_num_show": page_num,
                "keyword": file_keyword,
                "signature_type": sig_type,
                "version": version,
                "page_number": None,
                "full_path": pdf_path,
                "original_total_pages": total_pages
            })
            pdf_logger.info(f"📌 第{page_num}页：签字类型[{sig_type}] | 版本[v{version}] | 已标记为需要替换的页")

    except Exception as e:
        pdf_logger.error(f"❌ 处理{file_name}出错：{str(e)}")
        pdf_logger.error(f"📝 错误详情：")
        traceback.print_exc()

    finally:
        pdf_logger.info(f"📊 【数据核查计划】处理完成：{file_name} | 待替换页数量：{len(results)}")
    return results


def process_source1_document(pdf_path):
    """
    处理源目录1中的"普通主文件"类PDF
    :param pdf_path: PDF文件路径
    :return: 处理结果列表
    """
    results = []
    file_name = os.path.basename(pdf_path)

    try:
        file_keyword = contains_keywords(file_name, Config.MAIN_DOCUMENT_KEYWORDS)
        if not file_keyword:
            pdf_logger.info(f"⚠️ 文件名未匹配到任何主关键词[{Config.MAIN_DOCUMENT_KEYWORDS}]，跳过")
            return results
        pdf_logger.info(f"✅ 匹配关键词：{file_keyword}")

        reader = PdfReader(pdf_path)
        total_pages = len(reader.pages)
        max_pages = min(Config.MAX_PROCESS_PAGES, total_pages)
        pdf_logger.info(f"📊 总页数：{total_pages} | 计划处理页数：{max_pages}")

        for page_idx in range(max_pages):
            page_num = page_idx + 1
            page = reader.pages[page_idx]
            
            # 检查页面是否以图像层为主
            if is_ocr_page(page):
                pdf_logger.info(f"ℹ️ 第{page_num}页：页面以图像层为主，已经是签字页了")
                continue
            
            text = page.extract_text() or ""

            version = document_dvp_version(text)
            page_num_str = extract_page_number(text)

            if not version:
                pdf_logger.info(f"⚠️ 第{page_num}页：未提取到版本号，跳过")
                continue
            if not page_num_str:
                pdf_logger.info(f"⚠️ 第{page_num}页：版本[v{version}]，但未提取到页码，跳过")
                continue

            results.append({
                "file_name": file_name,
                "page_num": page_idx,
                "page_num_show": page_num,
                "keyword": file_keyword,
                "version": version,
                "page_number": page_num_str,
                "full_path": pdf_path,
                "original_total_pages": total_pages
            })
            pdf_logger.info(f"✅ 第{page_num}页：版本[v{version}] | 页码[{page_num_str}] | 已标记为待替换页")
    except Exception as e:
        pdf_logger.error(f"❌ 处理{file_name}出错：{str(e)}")
        pdf_logger.error(f"📝 错误详情：")
        traceback.print_exc()
    finally:
        pdf_logger.info(f"📊 【主文件】处理完成：{file_name} | 待替换页数量：{len(results)}")
        pdf_logger.info(f"{'-'*60}\n")
    return results


def process_source1_approval(pdf_path):
    """
    处理源目录1中的"审批文件"类PDF
    :param pdf_path: PDF文件路径
    :return: 处理结果列表
    """
    results = []
    file_name = os.path.basename(pdf_path)

    try:
        # 检查文件名是否包含审批文件关键词
        file_keyword = contains_keywords(file_name, Config.MAIN_APPROVAL_KEYWORDS)
        if not file_keyword:
            pdf_logger.info(f"⚠️ 文件名未匹配到任何审批关键词[{Config.MAIN_APPROVAL_KEYWORDS}]，跳过")
            return results
        pdf_logger.info(f"✅ 匹配审批关键词：{file_keyword}")

        reader = PdfReader(pdf_path)
        total_pages = len(reader.pages)
        max_pages = min(Config.MAX_PROCESS_PAGES, total_pages)
        pdf_logger.info(f"📊 总页数：{total_pages} | 计划处理页数：{max_pages}")

        for page_idx in range(max_pages):
            page_num = page_idx + 1
            page = reader.pages[page_idx]
            
            # 检查页面是否以图像层为主（通常为签字页）
            if is_ocr_page(page):
                pdf_logger.info(f"ℹ️ 第{page_num}页：页面以图像层为主，已经是签字页了")
                continue
            
            text = page.extract_text() or ""

            # 将版本提取函数从extract_version改为approval_version
            version = approval_version(text)
            page_num_str = extract_page_number(text)

            if not version:
                pdf_logger.info(f"⚠️ 第{page_num}页：未提取到版本号，跳过")
                continue
            if not page_num_str:
                pdf_logger.info(f"⚠️ 第{page_num}页：版本[v{version}]，但未提取到页码，跳过")
                continue

            results.append({
                "file_name": file_name,
                "page_num": page_idx,
                "page_num_show": page_num,
                "keyword": file_keyword,
                "version": version,
                "page_number": page_num_str,
                "full_path": pdf_path,
                "original_total_pages": total_pages
            })
            pdf_logger.info(f"✅ 第{page_num}页：版本[v{version}] | 页码[{page_num_str}] | 已标记为待替换页")
    except Exception as e:
        pdf_logger.error(f"❌ 处理{file_name}出错：{str(e)}")
        pdf_logger.error(f"📝 错误详情：")
        traceback.print_exc()
    finally:
        pdf_logger.info(f"📊 【审批文件】处理完成：{file_name} | 待替换页数量：{len(results)}")
        pdf_logger.info(f"{'-'*60}\n")
    return results


def process_source1_lockout(pdf_path):
    """
    处理源目录1中的"数据库锁定批准表"类PDF
    :param pdf_path: PDF文件路径
    :return: 处理结果列表
    """
    results = []
    file_name = os.path.basename(pdf_path)

    try:
        file_keyword = contains_keywords(file_name, Config.SPECIAL_KEYWORDS_LOCKOUT)
        if not file_keyword:
            pdf_logger.info(f"⚠️ 文件名未匹配到任何关键词[{Config.SPECIAL_KEYWORDS_LOCKOUT}]，跳过")
            return results
        pdf_logger.info(f"✅ 匹配关键词：{file_keyword}")

        reader = PdfReader(pdf_path)
        total_pages = len(reader.pages)
        max_pages = min(Config.MAX_PROCESS_PAGES, total_pages)
        pdf_logger.info(f"📊 总页数：{total_pages} | 计划处理页数：{max_pages}")

        for page_idx in range(max_pages):
            page_num = page_idx + 1
            page = reader.pages[page_idx]
            
            # 检查页面是否以图像层为主
            if is_ocr_page(page):
                pdf_logger.info(f"ℹ️ 第{page_num}页：页面以图像层为主，已经是签字页了")
                continue
            
            text = page.extract_text() or ""

            page_num_str = extract_page_number(text)

            if not page_num_str:
                pdf_logger.info(f"⚠️ 第{page_num}页：未提取到页码，跳过")
                continue

            results.append({
                "file_name": file_name,
                "page_num": page_idx,
                "page_num_show": page_num,
                "keyword": file_keyword,
                "version": None,
                "page_number": page_num_str,
                "full_path": pdf_path,
                "original_total_pages": total_pages
            })
            pdf_logger.info(f"✅ 第{page_num}页：页码[{page_num_str}] | 已标记为待替换页")
    except Exception as e:
        pdf_logger.error(f"❌ 处理{file_name}出错：{str(e)}")
        pdf_logger.error(f"📝 错误详情：")
        traceback.print_exc()
    finally:
        pdf_logger.info(f"📊 【数据库锁定批准表】处理完成：{file_name} | 待替换页数量：{len(results)}")
        pdf_logger.info(f"{'-'*60}\n")
    return results





def process_source2_dvp(page, page_idx, text, file_name, pdf_path):
    """
    处理源目录2中的"数据核查计划"类PDF
    :param page: PDF页面对象
    :param page_idx: 页面索引
    :param text: 页面文本内容
    :param file_name: 文件名
    :param pdf_path: PDF文件路径
    :return: 页面处理结果
    """
    page_num = page_idx + 1
    pdf_logger.info(f"🔍 检测到特殊关键词【{Config.SPECIAL_KEYWORDS_DVP}】，开始识别签字类型")
    file_keyword = contains_keywords(text, Config.SPECIAL_KEYWORDS_DVP)
    
    # 提取版本号和签字类型
    version = document_dvp_version(text)
    sig_type = identify_signature_type(text)
    
    if sig_type:
        pdf_logger.info(f"✅ 成功识别签字类型：{sig_type}")
    else:
        pdf_logger.info(f"⚠️ 未识别到签字类型，请检查页面内容是否包含{Config.SIGNATURE_TYPES}中的任何一种")
    
    # 构建结果
    result = {
        "file_name": file_name,
        "page_num": page_idx,
        "page_num_show": page_num,
        "version": version,
        "keyword": file_keyword,
        "page_object": page,
        "full_path": pdf_path,
        "has_keyword": True,
        "page_number": None,
        "has_version": bool(version),
        "signature_type": sig_type
    }
    
    # 记录状态
    status = [f"关键词[{Config.SPECIAL_KEYWORDS_DVP}]"]
    status.append(f"版本[v{version}]" if version else "无版本号")
    if sig_type:
        status.append(f"签字类型[{sig_type}]")
        
    pdf_logger.info(f"ℹ️ 第{page_num}页：{', '.join(status)} | 已记录为待匹配新页")
    
    return result


def process_source2_lockout(page, page_idx, text, file_name, pdf_path):
    """
    处理不包含主要文档的页面
    :param page: PDF页面对象
    :param page_idx: 页面索引
    :param text: 页面文本内容
    :param file_name: 文件名
    :param pdf_path: PDF文件路径
    :return: 页面处理结果
    """
    page_num = page_idx + 1
    
    # 提取页码（删除版本提取代码）
    page_num_str = extract_page_number(text)
    file_keyword = contains_keywords(text, Config.SPECIAL_KEYWORDS_LOCKOUT)
    
    # 构建结果（删除版本相关字段）
    result = {
        "file_name": file_name,
        "page_num": page_idx,
        "page_num_show": page_num,
        "version": None,
        "keyword": file_keyword,
        "page_object": page,
        "full_path": pdf_path,
        "has_keyword": True,
        "has_version": False
    }
    if page_num_str:
        result["page_number"] = page_num_str
    
    # 记录状态（删除版本相关信息）
    status = [f"关键词[{file_keyword}]"]
    if page_num_str:
        status.append(f"页码[{page_num_str}]")
    
    pdf_logger.info(f"ℹ️ 第{page_num}页：{', '.join(status)} | 已记录为待匹配新页")
    return result





def process_source2_document(page, page_idx, text, file_name, pdf_path):
    """
    处理不包含主要文档的页面
    :param page: PDF页面对象
    :param page_idx: 页面索引
    :param text: 页面文本内容
    :param file_name: 文件名
    :param pdf_path: PDF文件路径
    :return: 页面处理结果
    """
    page_num = page_idx + 1
    
    # 提取版本号和页码
    version = document_dvp_version(text)
    page_num_str = extract_page_number(text)
    file_keyword = contains_keywords(text, Config.MAIN_DOCUMENT_KEYWORDS)
    result = {
        "file_name": file_name,
        "page_num": page_idx,
        "page_num_show": page_num,
        "version": version,
        "keyword": file_keyword,
        "page_object": page,
        "full_path": pdf_path,
        "has_keyword": True,
        "has_version": bool(version)
    }
    if page_num_str:
        result["page_number"] = page_num_str
    
    status = [f"关键词[{file_keyword}]"]
    status.append(f"版本[v{version}]" if version else "无版本号")
    if page_num_str:
        status.append(f"页码[{page_num_str}]")
    
    pdf_logger.info(f"ℹ️ 第{page_num}页：{', '.join(status)} | 已记录为待匹配新页")
    return result










def process_source2_approval(page, page_idx, text, file_name, pdf_path):
    """
    处理不包含特殊关键词的页面（包括普通关键词和无关键词情况）
    :param page: PDF页面对象
    :param page_idx: 页面索引
    :param text: 页面文本内容
    :param file_name: 文件名
    :param pdf_path: PDF文件路径
    :return: 页面处理结果
    """
    page_num = page_idx + 1
    
    # 提取版本号和页码
    version = approval_version(text)
    
    page_num_str = extract_page_number(text)
    file_keyword = contains_keywords(text, Config.MAIN_APPROVAL_KEYWORDS)
    result = {
        "file_name": file_name,
        "page_num": page_idx,
        "page_num_show": page_num,
        "version": version,
        "keyword": file_keyword,
        "page_object": page,
        "full_path": pdf_path,
        "has_keyword": True,
        "has_version": bool(version)
    }
    if page_num_str:
        result["page_number"] = page_num_str
    
    status = [f"关键词[{file_keyword}]"]
    status.append(f"版本[v{version}]" if version else "无版本号")
    if page_num_str:
        status.append(f"页码[{page_num_str}]")
    
    pdf_logger.info(f"ℹ️ 第{page_num}页：{', '.join(status)} | 已记录为待匹配新页")
    return result


def process_source2_other(page, page_idx, text, file_name, pdf_path):
    """
    处理MAIN_OTHER_KEYWORDS类型的页面
    :param page: PDF页面对象
    :param page_idx: 页面索引
    :param text: 页面文本内容
    :param file_name: 文件名
    :param pdf_path: PDF文件路径
    :return: 页面处理结果
    """
    page_num = page_idx + 1
    
    # 提取页码（不提取版本号）
    page_num_str = extract_page_number(text)
    file_keyword = contains_keywords(text, Config.MAIN_OTHER_KEYWORDS)
    
    result = {
        "file_name": file_name,
        "page_num": page_idx,
        "page_num_show": page_num,
        "version": None,
        "keyword": file_keyword,
        "page_object": page,
        "full_path": pdf_path,
        "has_keyword": True,
        "has_version": False
    }
    if page_num_str:
        result["page_number"] = page_num_str
    
    # 记录状态
    status = [f"关键词[{file_keyword}]"]
    status.append("无版本号")  # MAIN_OTHER_KEYWORDS类型无版本号
    if page_num_str:
        status.append(f"页码[{page_num_str}]")
    
    pdf_logger.info(f"ℹ️ 第{page_num}页：{', '.join(status)} | 已记录为待匹配新页")
    return result



def process_source2(pdf_path):
    """
    处理源目录2中的PDF文件，根据关键词匹配不同的处理逻辑
    :param pdf_path: PDF文件路径
    :return: 处理结果列表
    """
    results = []
    file_name = os.path.basename(pdf_path)
    pdf_logger.info(f"📄 开始处理【源目录2 PDF】：{file_name}")
    try:
        reader = PdfReader(pdf_path)
        total_pages = len(reader.pages)
        pdf_logger.info(f"📊 总页数：{total_pages}，开始逐页处理")

        for page_idx in range(total_pages):
            page_num = page_idx + 1
            page = reader.pages[page_idx]
            text = page.extract_text() or ""
            pdf_logger.info(f"🔍 正在处理第{page_num}页")

            # 检查各类关键词并调用相应处理函数
            if contains_keywords(text, Config.SPECIAL_KEYWORDS_DVP):
                # 处理"数据核查计划"类PDF
                page_result = process_source2_dvp(
                    page, page_idx, text, file_name, pdf_path
                )
            elif contains_keywords(text, Config.MAIN_DOCUMENT_KEYWORDS):
                # 处理普通文档页面
                page_result = process_source2_document(
                    page, page_idx, text, file_name, pdf_path
                )
            elif contains_keywords(text, Config.MAIN_APPROVAL_KEYWORDS):
                # 处理审批页面
                page_result = process_source2_approval(
                    page, page_idx, text, file_name, pdf_path
                )
            elif contains_keywords(text, Config.MAIN_OTHER_KEYWORDS):
                # 处理其他关键词页面
                page_result = process_source2_other(
                    page, page_idx, text, file_name, pdf_path
                )
            elif contains_keywords(text, Config.SPECIAL_KEYWORDS_LOCKOUT):
                # 处理数据库锁定批准表页面
                page_result = process_source2_lockout(
                    page, page_idx, text, file_name, pdf_path
                )
            else:
                # 处理无匹配关键词的页面
                pdf_logger.info(f"ℹ️ 第{page_num}页：未匹配任何关键词 | 已记录为待匹配新页")
                page_result = {
                    "file_name": file_name,
                    "page_num": page_idx,
                    "page_num_show": page_num,
                    "keyword": None,
                    "version": None,
                    "page_object": page,
                    "full_path": pdf_path,
                    "has_keyword": False,
                    "has_version": False
                }
            
            results.append(page_result)

    except Exception as e:
        pdf_logger.error(f"❌ 处理{file_name}出错：{str(e)}")
        pdf_logger.error(f"📝 错误详情：")
        traceback.print_exc()

    finally:
        pdf_logger.info(f"📊 【源目录2 PDF】处理完成：{file_name} | 总处理页数：{len(results)}")
    return results